home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
vla
/
vla_font
/
vch2fnt.asm
< prev
next >
Wrap
Assembly Source File
|
1993-09-27
|
8KB
|
325 lines
IDEAL
DOSSEG
MODEL SMALL
STACK 200h
CODESEG
p386n
ASSUME CS:@CODE, DS:@CODE
───────────────────────────────────────────────────────────────────────────
INCLUDE "PRINTSUB.inc"
INCLUDE "MCLSUB.INC"
────────────────────────────────────────────────────────────────────────────
STRUC VCH_Header
Id db "VLACH"
From db ?
X db ?
Y db ?
NumChr db ?
ENDS
STRUC FNT_Header
Id db "VLAFNT"
X db 1 ;widths in BYTES (8 pixels)
Y db 8
NumChr db ?
StartChr db " " ;char to start with
ENDS
────────────────────────────────────────────────────────────────────────────
FileName_VCH db 130 dup (0)
Extension_VCH db ".VCH",0
Handle_VCH dw ?
FileName_FNT db 130 dup (0)
Extension_Fnt db ".FNT",0
Handle_FNT dw ?
Dsp_Seg dw ?
VCH_Seg dw ?
FNT_Seg dw ?
Credits db "VCH to FNT converter written by Draeden of VLA!"
db 13,10,10,0
MSG_OpenError db "Error loading VCH file.",13,10,0
MSG_OverWrite db "FNT file already exists, replace? (Y/N)",13,10,0
MSG_CreateError db "Failed to create FNT file.",13,10,0
MSG_WriteError db "Failed to write the FNT file!?",13,10,0
MSG_Written db " was successfully written.",0
VCHHead VCH_Header <>
FNTHead FNT_Header <>
───────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────
;This routine opens the VCH file
;Returns CF = 0 = Success! VCH file opened
; CF = 1 = Failed to open file
──────────────────────────────────────────────────────────────────
PROC Open_VCH NEAR
pusha
push ds
mov ax,cs
mov ds,ax
mov dx,offset FileName_VCH
mov ax,3d00h ;open file
int 21h
jc @@END
mov [Handle_VCH],ax
clc
@@END:
pop ds
popa
ret
ENDP
──────────────────────────────────────────────────────────────────
;This routine creates (safely) the FNT file
;Returns CF = 0 = Success! was able to create file
; CF = 1 = Failed! could not create FNT file
──────────────────────────────────────────────────────────────────
PROC Create_FNT NEAR
pusha
push ds
mov ax,cs
mov ds,ax
mov dx,offset FileName_FNT
mov ax,5b00h ;create file (safe)
xor cx,cx
int 21h
jc @@FileError1
mov [Handle_FNT],ax
clc ;No error occured
jmp @@End
@@FileError1:
mov si,offset MSG_Overwrite
call PrintZ
call YesNo
jnc @@Abort
mov dx,offset FileName_FNT
mov ax,3c00h ;create file (unsafe)
xor cx,cx
int 21h
jc @@Abort
mov [Handle_FNT],ax
clc ;No error occured
jmp @@End
@@Abort:
stc
@@END:
pop ds
popa
ret
ENDP
──────────────────────────────────────────────────────────────────
;Closes VCH file... nothing can go wrong that we care about...
──────────────────────────────────────────────────────────────────
PROC Close_VCH NEAR
push ax bx
mov bx,[cs:HANDLE_VCH]
mov ah,3eh
int 21h
pop bx ax
ret
ENDP
──────────────────────────────────────────────────────────────────
;Closes FNT file... nothing can go wrong that we care about...
──────────────────────────────────────────────────────────────────
PROC Close_FNT NEAR
push ax bx
mov bx,[cs:HANDLE_FNT]
mov ah,3eh
int 21h
pop bx ax
ret
ENDP
──────────────────────────────────────────────────────────────────
; Converts the VCH to FNT
──────────────────────────────────────────────────────────────────
PROC Convert_VCH2FNT NEAR
pusha
push ds es
mov ax,cs
mov ds,ax
mov al,[VCHhead.NumChr]
mov [FNThead.NumChr],al
mov al,[VCHhead.From]
mov [FNThead.StartChr],al
mov [FNThead.X],1 ;that's 8 pixels wide
mov al,[VCHhead.Y]
mov [FNThead.Y],al
xor si,si
mov di,si
mov es,[FNT_Seg]
mov ds,[VCH_Seg]
mov ch,[cs:FNThead.NumChr]
mov cl,[cs:FNThead.Y]
xor ah,ah
mov dl,8
@@CLoop:
shl ah,1
lodsb
or al,al
je @@Tis0
or ah,1
@@Tis0:
dec dl
jne @@Cloop
mov dl,8
mov al,ah
stosb
xor ah,ah
dec cl
jne @@CLoop
mov cl,[cs:FNThead.Y]
dec ch
jne @@Cloop
pop es ds
popa
ret
ENDP
──────────────────────────────────────────────────────────────────
; Writes the FNT header and all the FNT data
──────────────────────────────────────────────────────────────────
PROC Write_FNT NEAR
pusha
push ds
mov ax,cs
mov ds,ax
mov bx,[HANDLE_FNT] ;save FNT header
mov cx,(size FNT_HEADER)
mov ah,40h
mov dx,offset FNThead
int 21h
jc @@FileError
mov al,[cs:FNTHead.NumChr]
mov ah,[cs:FNTHead.Y]
mul ah
movzx cx,[cs:FNTHead.X]
mul cx
mov cx,ax
mov ds,[cs:FNT_Seg]
mov dx,dx ;save off FNT data
mov ah,40h
int 21h
clc
@@FileError:
pop ds
popa
ret
ENDP
──────────────────────────────────────────────────────────────────
; Reads in the VCH header and all the character data
──────────────────────────────────────────────────────────────────
PROC Read_VCH NEAR
pusha
push ds
mov ax,cs
mov ds,ax
mov bx,[Handle_VCH]
mov cx,(size VCH_Header)
mov dx,offset VCHhead
mov ah,3fh
int 21h
mov ds,[VCH_seg]
mov al,[cs:VCHHead.NumChr]
mov ah,[cs:VCHHead.X]
cmp ah,8
jne @@Fail
mul ah
movzx cx,[cs:VCHHead.Y]
mul cx
xor dx,dx
mov cx,ax
mov ah,3fh
int 21h ;read in all of the stuff
clc
jmp short @@Done
@@Fail:
stc
@@Done:
pop ds
popa
ret
ENDP
────────────────────────────────────────────────────────────────────────────
Start:
mov ax,cs
mov ds,ax
mov [Dsp_Seg],es
mov bx,ss
mov ax,sp
add ax,15
shr ax,4
add bx,ax
mov [VCH_Seg],bx
add bx,1000h
mov [FNT_Seg],bx
mov es,[Dsp_Seg]
mov dx,offset FileName_VCH
mov bx,offset Extension_VCH
mov bp,1 ;override extension
call GetCommandLine
mov dx,offset FileName_FNT
mov bx,offset Extension_FNT
call GetCommandLine
call Open_VCH
jnc @@NoFileError
mov si,offset MSG_OpenError
call PrintZ
mov al,1
jmp ExitProg
@@NoFileError:
call Create_FNT
jnc @@NoCreateError
call Close_VCH
mov si,offset MSG_CreateError
call PrintZ
mov al,2
jmp ExitProg
@@NoCreateError:
call Read_VCH
call Convert_VCH2FNT
call Write_FNT
call Close_FNT
call Close_VCH
mov si,offset FileName_FNT
call PrintZ
mov si,offset MSG_Written
call PrintZ
xor al,al
ExitProg:
mov ah,4ch
int 21h
END START